package com.bluedot.www.core.pojo.DTO;

import com.bluedot.www.core.common.ResultCodeEnum;

import java.util.HashMap;
import java.util.Map;

/**
 * <p>对外传输结果值封装</p>
 * 使用链式编程，example: R.ok() | R.error().message("操作失败"),
 * 操作成功可以写原因，但是操作失败最好写明失败原因
 *
 * @author He Peng
 * @date 2021/6/7 12:57
 */
public class R {
    /**
     * http请求是否请求成功
     */
    private Boolean success;
    /**
     * 状态码
     */
    private Integer code;
    /**
     * 处理请求之后的消息（失败一定要有错误描述）
     */
    private String message;
    /**
     * 从数据库中获得的数据
     */
    private Map<String, Object> data;

    /**
     * 构造器私有, 只能通过静态方法创建对象
     *
     * @author He Peng
     * @date 2021/8/7 21:03
     */
    private R() {
        this.data = new HashMap<>();
    }

    /**
     * 通用返回成功
     *
     * @return com.bluedot.www.core.pojo.DTO.R
     * @author He Peng
     * @date 2021/8/7 21:03
     */
    public static R ok() {
        R r = new R();
        r.setSuccess(ResultCodeEnum.SUCCESS.getSuccess());
        r.setCode(ResultCodeEnum.SUCCESS.getCode());
        r.setMessage(ResultCodeEnum.SUCCESS.getMessage());
        return r;
    }

    /**
     * 通用返回失败，返回未知错误
     *
     * @return com.bluedot.www.core.pojo.DTO.R
     * @author He Peng
     * @date 2021/8/7 21:44
     */
    public static R error() {
        R r = new R();
        r.setSuccess(ResultCodeEnum.UNKNOWN_ERROR.getSuccess());
        r.setCode(ResultCodeEnum.UNKNOWN_ERROR.getCode());
        r.setMessage(ResultCodeEnum.UNKNOWN_ERROR.getMessage());
        return r;
    }

    /**
     * 设置结果，形参为结果枚举
     *
     * @param result: 枚举类信息
     * @return com.bluedot.www.core.pojo.DTO.R
     * @author He Peng
     * @date 2021/8/7 21:43
     */
    public static R setResult(ResultCodeEnum result) {
        R r = new R();
        r.setSuccess(result.getSuccess());
        r.setCode(result.getCode());
        r.setMessage(result.getMessage());
        return r;
    }


    /*------------使用链式编程，返回类本身-----------*/

    /**
     * 自定义返回数据
     *
     * @param map:
     * @return com.bluedot.www.core.pojo.DTO.R
     * @author He Peng
     * @date 2021/8/7 21:00
     */
    public R data(Map<String, Object> map) {
        this.setData(map);
        return this;
    }

    /**
     * 通用设置data
     *
     * @param key:   返回数据的名字
     * @param value: 数据的实际值
     * @return com.bluedot.www.core.pojo.DTO.R
     * @author He Peng
     * @date 2021/8/7 21:03
     */
    public R data(String key, Object value) {
        this.data.put(key, value);
        return this;
    }

    /**
     * 自定义状态信息
     *
     * @param message: 通常用于描述失败原因
     * @return com.bluedot.www.core.pojo.DTO.R
     * @author He Peng
     * @date 2021/8/7 21:04
     */
    public R message(String message) {
        this.setMessage(message);
        return this;
    }

    /**
     * 自定义状态码
     *
     * @param code: 状态码
     * @return com.bluedot.www.core.pojo.DTO.R
     * @author He Peng
     * @date 2021/8/7 21:05
     */
    public R code(Integer code) {
        this.setCode(code);
        return this;
    }

    /**
     * 自定义返回结果
     *
     * @param success:
     * @return com.bluedot.www.core.pojo.DTO.R
     * @author He Peng
     * @date 2021/8/7 21:05
     */
    public R success(Boolean success) {
        this.setSuccess(success);
        return this;
    }

    private Boolean getSuccess() {
        return success;
    }

    private void setSuccess(Boolean success) {
        this.success = success;
    }

    private Integer getCode() {
        return code;
    }

    private void setCode(Integer code) {
        this.code = code;
    }

    private String getMessage() {
        return message;
    }

    private void setMessage(String message) {
        this.message = message;
    }

    private void setData(Map<String, Object> data) {
        this.data = data;
    }
}
